iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0
AI/ ML & Data

AI 學習紀錄系列 第 23

Day 23 : Line Bot + LLM

  • 分享至 

  • xImage
  •  

各種新東西都測過了,今天就來嘗試建立一個聊天機器人。
Day 1 有測試了一個 LLM 模型,就用它來跟 Line Bot 結合起來試試。

首先先到 LINE Developers 來建立一個 Providers。
https://developers.line.biz/console/

開啟連結,登入後,按下 Providers 頁面中的 Create。
https://ithelp.ithome.com.tw/upload/images/20240907/20168318iC41jiMycM.png

依照要求輸入名稱。
https://ithelp.ithome.com.tw/upload/images/20240907/201683183MuD6BN8aP.png

接著創建一個 Channel。
https://ithelp.ithome.com.tw/upload/images/20240907/20168318JL61nkgg5j.png

選擇 Messaging API,接著照要求填入資訊即可,隨意填。
https://ithelp.ithome.com.tw/upload/images/20240907/20168318luvSC9fuAq.png

創建好後就可以看到 QR CODE 跟基本資訊了。
https://ithelp.ithome.com.tw/upload/images/20240907/20168318fQHS4zhPne.png

接著來把 API 架起來。我們會需要 Basuc setting 分頁下的 Channel secret,還有 Messaging API 分頁下的 Channel access token,先把他記下來,稍後會用到。

參考官方文件,安裝 python sdk。
https://developers.line.biz/en/docs/messaging-api/line-bot-sdk/#official-sdks
https://github.com/line/line-bot-sdk-python

https://ithelp.ithome.com.tw/upload/images/20240907/201683182wzuCxmHx0.png

https://ithelp.ithome.com.tw/upload/images/20240907/20168318dOeEgZaOW9.png

$ pip install line-bot-sdk

照著 README 提供的範例,即可完成簡易的 API。

程式中的 YOUR_CHANNEL_ACCESS_TOKEN、YOUR_CHANNEL_SECRET 就是剛剛在 LINE Developers 頁面中存下來兩個字串,填入即可。

from flask import Flask, request, abort

from linebot.v3 import (
    WebhookHandler
)
from linebot.v3.exceptions import (
    InvalidSignatureError
)
from linebot.v3.messaging import (
    Configuration,
    ApiClient,
    MessagingApi,
    ReplyMessageRequest,
    TextMessage
)
from linebot.v3.webhooks import (
    MessageEvent,
    TextMessageContent
)

app = Flask(__name__)

configuration = Configuration(access_token='YOUR_CHANNEL_ACCESS_TOKEN')
handler = WebhookHandler('YOUR_CHANNEL_SECRET')

@app.route("/callback", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        app.logger.info("Invalid signature. Please check your channel access token/channel secret.")
        abort(400)

    return 'OK'

@handler.add(MessageEvent, message=TextMessageContent)
def handle_message(event):
    with ApiClient(configuration) as api_client:
        line_bot_api = MessagingApi(api_client)
        line_bot_api.reply_message_with_http_info(
            ReplyMessageRequest(
                reply_token=event.reply_token,
                messages=[TextMessage(text=event.message.text)]
            )
        )

if __name__ == "__main__":
    app.run()

程式運行起來後,回到 LINE Developers 中的 Messaging API 頁面,把 API 的網址填上。

如果是上述範例,那麼 URL 應該長得像這樣:
https://yourapi/callback
https://ithelp.ithome.com.tw/upload/images/20240907/20168318bWbLScVWc4.png

到這邊就完成了,可以用 Messaging API 分頁下的 QR code 加入好友,嘗試看看是不是有反應,如範例程式運作順利,這會是一個 ECHO 機器人。

接著我們就可以嘗試把他跟 Day 1 做的 LLM 組合一下,變成這樣:

from flask import Flask, request, abort

from linebot.v3 import (
    WebhookHandler
)
from linebot.v3.exceptions import (
    InvalidSignatureError
)
from linebot.v3.messaging import (
    Configuration,
    ApiClient,
    MessagingApi,
    ReplyMessageRequest,
    TextMessage
)
from linebot.v3.webhooks import (
    MessageEvent,
    TextMessageContent
)

from transformers import AutoTokenizer, AutoModel
import torch

tokenizer = AutoTokenizer.from_pretrained(r"G:\LLM\chatglm-6b", trust_remote_code=True)

model = AutoModel.from_pretrained(r"G:\LLM\chatglm-6b", trust_remote_code=True).half().cuda()
model = model.eval()

history = []

app = Flask(__name__)

configuration = Configuration(access_token='YOUR_CHANNEL_ACCESS_TOKEN')
handler = WebhookHandler('YOUR_CHANNEL_SECRET')

@app.route("/callback", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)
    
    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        app.logger.info("Invalid signature. Please check your channel access token/channel secret.")
        abort(400)

    return 'OK'

@handler.add(MessageEvent, message=TextMessageContent)
def handle_message(event):
    global history
    with ApiClient(configuration) as api_client:
        response="FAIL"
        print(event.message.text)
        response, history = model.chat(tokenizer, event.message.text, history=history)
        print(response)
        line_bot_api = MessagingApi(api_client)
        line_bot_api.reply_message_with_http_info(
            ReplyMessageRequest(
                reply_token=event.reply_token,
                messages=[TextMessage(text=response)]#event.message.text
            )
        )

if __name__ == "__main__":
    app.run(debug=False,host='localhost',port=80)

運行起來後,屬於你的 LLM 機器人就完成了。
嘗試跟他對話看看,結果如下,當然回復速度就取決於你的設備效能。
https://ithelp.ithome.com.tw/upload/images/20240907/20168318bTxirnu4LX.png


上一篇
Day 22: Cursor
下一篇
Day 24 : Line Bot 圖片 + ngrok
系列文
AI 學習紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言